package com.wans.user.service.impl;

import com.wans.common.constans.StatusEnum;
import com.wans.user.common.em.UserRegisterEnum;
import com.wans.user.exception.UserRegisterException;
import com.wans.common.redis.RedisUtils;
import com.wans.common.result.ResponseResult;
import com.wans.model.user.dtos.UserDTO;
import com.wans.model.user.dos.User;
import com.wans.user.mapper.UserMapper;
import com.wans.user.service.UserRegisterService;
import com.wans.utils.string.CryptoUtils;
import com.wans.utils.string.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.UUID;

@Service
@SuppressWarnings("all")
public class UserRegisterServiceImpl implements UserRegisterService {


    @Autowired
    // 操作 user 表
    private UserMapper userMapper;


    /**
     * 用户注册功能 -
     *
     * @param userRegisterInfo 注册信息 （账号、密码）
     * @return 响应信息
     */
    @Override
    @Transactional
    public ResponseResult<Void> insertUser(UserDTO userRegisterInfo) {

        // 数据校验 - 数据准备
        User user = checkAndReadyUser(userRegisterInfo);

        // 把 user 插入数据库
        Integer inserted = userMapper.insertUser(user);

        if (inserted == 0)
            // 数据插入失败
            throw new UserRegisterException(UserRegisterEnum.USER_INFO_NULL_ERROR);

        // 注册成功
        return ResponseResult.success(UserRegisterEnum.USER_REGISTER_SUCCESS.getMessage());
    }


    /**
     * 检查账号是否已经存在 - 准备 User 数据
     *
     * @param userRegisterInfo 账号、密码
     * @return 用户数据
     */
    private User checkAndReadyUser(UserDTO userRegisterInfo) {

        // 查询账号是否存在
        User user = userMapper.getUserByAccount(userRegisterInfo.getAccount());
        if (user != null)
            // 表明账号已经存在了无法注册
            throw new UserRegisterException(UserRegisterEnum.USER_ACCOUNT_EXIST_ERROR);

        // 构建数据
        user = new User();
        user.setId(UUID.randomUUID().toString().replaceAll("-", ""));
        user.setAccount(userRegisterInfo.getAccount());
        user.setStatus(StatusEnum.USER_STATUS_DEFAULT.getCode().byteValue());
        // - 加盐
        user.setSalt(RandomStringUtils.randomExcludeAmbiguous(3));
        user.setSalt2(RandomStringUtils.randomExcludeAmbiguous(5));
        // 哈希 - MD5 - 32 字符
        user.setPassword(CryptoUtils.hashMD5(userRegisterInfo.getPassword(), user.getSalt(), user.getSalt2()));
        // 昵称
        user.setNick(CryptoUtils.md5(user.getAccount()).substring(24));
        // 创建时间 - 更新时间
        user.setCreateTime(LocalDateTime.now());
        user.setUpdateTime(LocalDateTime.now());


        return user;
    }

}
